package pharao.client.views.game.landkarte.ort.exam;

import java.util.Iterator;
import java.util.List;

import pharao.client.dto.ExamenStatusDTO;
import pharao.client.views.game.landkarte.ort.lesson.Lesson;

public class Examen {
	
	public static final int EXAMEN_TYP_GOLD 	= 0;
	public static final int EXAMEN_TYP_SILBER	= 1;
	public static final int EXAMEN_TYP_BRONCE	= 2;
	
	/**
	 * wurden die Lessons auf der Seite schon geprüft
	 */
	private boolean checked = false;
	
	/**
	 * wurde das Examen gestartet
	 */
	private boolean started = false;

	/**
	 * enthält alle Übungsaufgaben
	 */
	private List listLessons;
	
	/**
	 * enthält den Examen-Status
	 */
	private ExamenStatusDTO examenStatusDTO;
	
	/**
	 * enthält den typ des Examens
	 */
	private int examenTyp;
	
	/**
	 * enthält den Titel des Examens
	 */
	private String title;
	
	/**
	 * wieviele Aufgaben sollen pro Seite angezeigt werden
	 * default = 5;
	 */
	private int lessonsPerPage = 5;
	
	/**
	 * definiert ab wieviel prozent die prüfung bestanden ist, default: 0.90f
	 */
	private float passedPercent = 0.90f;
	
	/**
	 * 
	 * @param examenTyp Examen.EXAMEN_TYP_*
	 * @param listLessons
	 */
	public Examen(String title, int examenTyp, List listLessons) {
		setTitle(title);
		setListLessons(listLessons);
		setExamenTyp(examenTyp);
	}
	
	/**
	 * prüft die angegebenen Werte
	 */
	public void checkEntrys() {
		
		setChecked(true);
		
		examenStatusDTO = new ExamenStatusDTO();
		
		Iterator iterator = listLessons.iterator();
		while (iterator.hasNext()) {
			Lesson lesson = (Lesson) iterator.next();
			lesson.checkEntry();
			
		}
		
		addResult(examenStatusDTO, listLessons);
		
		setExamStatusDTO(examenStatusDTO);
		
	}
	
	private void addResult(ExamenStatusDTO examenStatusDTO, List listLesson) {
		
		int cntPassed = 0;
		
		Iterator iterator = listLesson.iterator();
		while (iterator.hasNext()) {
			
			Lesson lesson = (Lesson) iterator.next();
			if (lesson.getAufgabensStatusDTO().isPassed()) {
				cntPassed++;
			}
		}
		
		float fExamResult = cntPassed / listLesson.size();
		
		if (fExamResult >= getPassedPercent()) {
			examenStatusDTO.setPassed(true);
		}
	}

	public List getListLessons() {
		return listLessons;
	}
	
	public boolean isChecked() {
		return checked;
	}

	private void setChecked(boolean checked) {
		this.checked = checked;
	}

	private void setListLessons(List listLessons) {
		this.listLessons = listLessons;
	}

	public int getExamenTyp() {
		return examenTyp;
	}

	private void setExamenTyp(int examenTyp) {
		this.examenTyp = examenTyp;
	}

	public String getTitle() {
		return title;
	}

	private void setTitle(String titel) {
		this.title = titel;
	}

	public int getLessonsPerPage() {
		return lessonsPerPage;
	}

	public void setLessonsPerPage(int lessonsPerPage) {
		this.lessonsPerPage = lessonsPerPage;
	}
	
	public ExamenStatusDTO getExamenStatusDTO() {
		
		if (!checked) {
			return null;
		}
		
		
		
		if (getExamenTyp() == EXAMEN_TYP_GOLD) {
			examenStatusDTO.setType(ExamenStatusDTO.TYP_GOLD);
		} else if (getExamenTyp() == EXAMEN_TYP_SILBER) {
			examenStatusDTO.setType(ExamenStatusDTO.TYP_SILBER);
		} else if (getExamenTyp() == EXAMEN_TYP_BRONCE) {
			examenStatusDTO.setType(ExamenStatusDTO.TYP_BRONCE);
		}
		
		return examenStatusDTO; 
	}

	public float getPassedPercent() {
		return passedPercent;
	}

	public void setPassedPercent(float passedPercent) {
		this.passedPercent = passedPercent;
	}

	/**
	 * 
	 * @return
	 */
	public ExamenStatusDTO getExamStatusDTO() {
		
		if (isStarted()) {
			checkEntrys();
			return examenStatusDTO;
		} 
		
		//TODO Exception werfen dass das Examen noch nicht gestartet wurde
		return null;
		
	}

	private void setExamStatusDTO(ExamenStatusDTO examenStatusDTO) {
		this.examenStatusDTO = examenStatusDTO;
	}

	private boolean isStarted() {
		return started;
	}

	private void setStarted(boolean started) {
		this.started = started;
	}
}
